﻿Public Class MoteurEqTarif
    Implements IMoteurEqTarif

    Private m_input As IInputMoteurEqTarif

    Public Sub New(ByVal Input As IInputMoteurEqTarif)
        m_input = Input
    End Sub

    Public Sub Calculer() Implements IMoteurEqTarif.Calculer
        'Dim echeancier(nbPer - 1, 7) As Double
        'Dim VAP_deces As Double = 0, VAP_INCINV As Double = 0, VAP_assiette As Double = 0
        'Dim mensualite As Double = (-1) * Microsoft.VisualBasic.Pmt(txNomPer, nbPer, CI, , DueDate.EndOfPeriod)
        'Dim txTechA As Double = _coll_param.Tx_TechA.ValeursEnCours

        ''Initialisation de l'échéancier
        'echeancier(0, 0) = CI
        'echeancier(0, 1) = ageSous
        ''Remarque1 : Attention au calcul des taux mensuels dans l'outil NA
        ''Remarque2 : Attention au calcul des âges dans l'outil NA
        'echeancier(0, 2) = TableMort.TxMortalite(ageSous) / 12
        '' echeancier(0, 2) = IIf(sexeAssu = "H", m_tble_mortalite_H, m_tble_mortalite_F).Rows(ageSous)(nomTxMortAn) / 12
        'echeancier(0, 3) = 1
        'echeancier(0, 4) = (echeancier(0, 0) * echeancier(0, 2) * echeancier(0, 3))
        'echeancier(0, 5) = CI * echeancier(0, 2) * echeancier(0, 3) _
        '                   * (1 + txTechA) ^ (-(0.5) / 12)
        'echeancier(0, 6) = CI * (1 + txTechA) ^ (-(0.5) / 12)
        'echeancier(0, 7) = 0

        'VAP_deces = echeancier(0, 5)
        'VAP_assiette = echeancier(0, 6)

        ''Récurrence sur l'échéancier
        'For i = 1 To nbPer - 1



        '    Dim age As Double = ageSous + i / 12

        '    If txNomPer = 0 Then txNomPer = 0.000000001
        '    'If txNomPer = Double.Epsilon Then
        '    'End If

        '    echeancier(i, 0) = CI * ((1 + txNomPer) ^ nbPer - (1 + txNomPer) ^ i) / ((1 + txNomPer) ^ nbPer - 1)
        '    echeancier(i, 1) = ageSous + CType(i / 12, Integer)

        '    ' ********************************************************


        '    'echeancier(i, 2) = (IIf(sexeAssu = "H", _tble_mortalite_H, _table_mortalite_F).Rows(ageSous + CType((i / 12) + 0.000000001, Integer))((nomTxMortAn))) / 12
        '    Dim AgeRech As Integer = ageSous + CType((i / 12) + 0.000000001, Integer)

        '    'TimeFonctCalculSecondaire1 = Timer
        '    'TimeFonctCalculPrinc2 = Timer
        '    'TempsFonctCalculPrinc = TempsFonctCalculPrinc + (TimeFonctCalculPrinc2 - TimeFonctCalculPrinc1)

        '    'TimeFonctCalculPrinc1 = Timer
        '    'TimeFonctCalculSecondaire2 = Timer
        '    'TempsFonctCalculSecondaire = TempsFonctCalculSecondaire + (TimeFonctCalculSecondaire2 - TimeFonctCalculSecondaire1)

        '    echeancier(i, 2) = TableMort.TxMortalite(AgeRech) / 12 'm_tble_mortalite_H.Rows(AgeRech)(nomTxMortAn)

        '    ' ********************************************************


        '    echeancier(i, 3) = echeancier(i - 1, 3) * (1 - echeancier(i, 2))
        '    'Attention, l'actualisation de la valeur probable des prestations DC
        '    's'effectue en taux proportionnel (tx_annuel/12). Ce n'est pas cohérent avec le calcul des CRD
        '    'Hypothèse de paiement des sinistres en milieu de période

        '    echeancier(i, 4) = (echeancier(i, 0) * echeancier(i, 2) * echeancier(i, 3))
        '    If age < ageFinDC Then
        '        echeancier(i, 5) = (echeancier(i, 0) * echeancier(i, 2) * echeancier(i, 3)) * (1 + txTechA) ^ (-(i + 0.5) / 12)
        '    Else
        '        echeancier(i, 5) = 0
        '    End If
        '    echeancier(i, 6) = CI * echeancier(i, 3) * (1 + txTechA) ^ (-(i + 0.5) / 12)

        '    'Prestation probable en INCINV (dans la version 1, on fixe la franchise à 3 mois)
        '    If i <= 3 Or age >= ageFinINCINV Then
        '        echeancier(i, 7) = 0
        '    Else
        '        'On calcule, de même que dans le fichier de recette, durée-numPériode
        '        Dim dureeCouvINC As Integer = Math.Min(36, nbPer - i)
        '        Dim tx_HorsFra As Double = TableMaintINCINV_Tx.ProbaMaintien(dureeCouvINC, ageSous)
        '        'On récupère le taux d'entrée (ici 0,5 pour simplifier)
        '        Dim tx_entree As Double = _coll_param.Tx_mensEntreeINCINV.ValeursEnCours

        '        'On applique un taux constant car la franchise est fixée à 3 mois
        '        Dim tx_reducFRA As Double = TableMaintINCINV_Fra.TauxAbattement_Fra(3, ageSous)

        '        'On mpultiplie par la proba de survie dans le crédit
        '        echeancier(i, 7) = (tx_entree * mensualite * tx_HorsFra * tx_reducFRA * echeancier(i, 3)) * (1 + txTechA) ^ (-(i + 0.5) / 12)

        '    End If
        '    VAP_deces = VAP_deces + echeancier(i, 5)
        '    VAP_assiette = VAP_assiette + echeancier(i, 6)
        '    VAP_INCINV = VAP_INCINV + echeancier(i, 7)
        'Next

        'Dim result(1) As Double
        'result(0) = VAP_deces / VAP_assiette
        'result(1) = VAP_INCINV / VAP_assiette

        'Return result
    End Sub
    Public Event After_Calculer() Implements IMoteurEqTarif.After_Calculer

    Public ReadOnly Property Input As IInputMoteurEqTarif Implements IMoteurEqTarif.Input
        Get
            Return m_input
        End Get
    End Property

End Class
